/**
 * 接收函数A作为参数，运行后能够返回一个新的函数。并且这个新的函数能够处理函数A的剩余参数。
 */

/**
 * 延迟计算
 * 使用闭包把传入参数保存起来，当传入的参数的数量足够执行函数时，
 * 就开始执行函数，参数长度为 0 的时候，就执行函数
 */
const add = (...args) => args.reduce((a, b) => a + b)
function currying (fnc) {
  const args = []
  return function result (...rest) {
    // rest 表示的是当前传入的参数
    console.log(...rest)
    if (0 === rest.length) {
      return fnc(...args)
    } else {
      args.push(...rest)
      return result
    }
  }
}

// var sum = currying(add)
// sum(1, 2)(2)
// sum(3)
// console.log(sum())

/**
 * 模拟 bind（延迟计算的思路）
 */


